C++ 左值与右值

左值与右值

简单定义

  • 左值(lvalue, locator value)表示了一个占据内存中某个可识别的位置(也就是一个地址)的对象
  • 右值(rvalue)是一个不表示内存中某个可识别位置的对象的表达式(一个表达式不是左值就是右值)
1
2
3
int var = 4l; // 正确
4 = var; // 错误
(var + 1) = 4; // 错误

常量 4 和表达式 var + 1 都不是左值(也就是说,它们是右值),因为它们都是表达式的临时结果,而没有可识别的内存位置(也就是说,只存在于计算过程中的每个临时寄存器中)。因此,赋值给它们是没有任何语义上的意义的——我们赋值到了一个不存在的位置。

右值引用

  • 定义: 右值引用是一种新的引用类型,通过 && 表示。它允许我们绑定到右值(临时对象、将要销毁的对象)。
  • 作用: 主要用于实现移动语义和完美转发
1
int&& rvalue = 42;  // rvalue 是右值引用

移动语义

  • 定义: 移动语义是一种允许将资源(如内存)从一个对象“移动”到另一个对象的语义。它通过右值引用来实现,避免了不必要的拷贝操作。
  • 优势: 提高了性能,特别是在处理临时对象、容器元素的插入、返回值优化等场景。

万能引用

1
2
3
4
5
template<typename T>
void print(T&& str) {
str = "hello liulun";
std::cout << str << std::endl;
}

这里的 print 可以接受左值引用,也能接受右值引用

作者

大下坡

发布于

2023-11-14

更新于

2023-11-14

许可协议